home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Graph.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  2KB  |  75 lines

  1. #include "stdafx.h"
  2.  
  3. LPDIRECTDRAWSURFACE4 create_surface(int w, int h, DWORD caps, DWORD flags)
  4. {
  5.     DDSURFACEDESC2 ddsd;
  6.     LPDIRECTDRAWSURFACE4 dds = 0;
  7.  
  8.     ZeroMemory(&ddsd, sizeof(ddsd));
  9.     ddsd.dwSize = sizeof(ddsd);
  10.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | flags;
  11.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | caps;
  12.     ddsd.dwWidth = w;
  13.     ddsd.dwHeight = h;
  14.     ddsd.ddckCKSrcBlt.dwColorSpaceLowValue = mask_color;
  15.     ddsd.ddckCKSrcBlt.dwColorSpaceHighValue = mask_color;
  16.     
  17.     DD->CreateSurface(&ddsd, &dds, 0);
  18.     
  19.     return dds;
  20. }
  21.  
  22. void clear(LPDIRECTDRAWSURFACE4 buf, int color)
  23. {
  24.     DDBLTFX ddbltfx;
  25.     
  26.     ddbltfx.dwSize = sizeof(ddbltfx);
  27.     ddbltfx.dwFillColor = color;
  28.     
  29.     while (!draw_ok(buf->Blt(0, 0, 0, DDBLT_WAIT | DDBLT_COLORFILL, &ddbltfx)));
  30. }
  31.  
  32. int match_color(COLORREF rgb)
  33. {    
  34.     DDSURFACEDESC2 ddsd;
  35.     HDC hdc;    
  36.     int c;
  37.     
  38.     // Use GDI SetPixel to do the color conversion
  39.     
  40.     if (FAILED(screen->GetDC(&hdc)))
  41.         error("Unable to get device context for color match");
  42.     
  43.     SetPixel(hdc, 0, 0, rgb);
  44.     
  45.     screen->ReleaseDC(hdc);
  46.     
  47.     // Lock the surface for readback
  48.     
  49.     ddsd.dwSize = sizeof(ddsd);
  50.     
  51.     if (FAILED(screen->Lock(0, &ddsd, DDLOCK_WAIT, 0)))
  52.         error("Unable to lock memory for color match");
  53.     
  54.     c = *(int *)ddsd.lpSurface;
  55.  
  56.     switch(ddsd.ddpfPixelFormat.dwRGBBitCount)
  57.     {
  58.     case 8:
  59.         c &= 0xff;
  60.         break;
  61.  
  62.     case 16:
  63.         c &= 0xffff;
  64.         break;
  65.  
  66.     case 24:
  67.         c &= 0xffffff;
  68.     }
  69.     
  70.     screen->Unlock(0);
  71.     
  72.     return c;
  73. }
  74.  
  75.